/*
	Slimbox v2.04 - The ultimate lightweight Lightbox clone for jQuery
	(c) 2007-2010 Christophe Beyls <http://www.digitalia.be>
	MIT-style license.
*/
(function (w) {
  var E = w(window),
    u,
    f,
    F = -1,
    n,
    x,
    D,
    v,
    y,
    L,
    r,
    m = !window.XMLHttpRequest,
    s = [],
    l = document.documentElement,
    k = {},
    t = new Image(),
    J = new Image(),
    H,
    a,
    g,
    p,
    I,
    d,
    G,
    c,
    A,
    K;
  w(function () {
    w('body').append(
      w([
        (H = w('<div id="lbOverlay"></div>')[0]),
        (a = w('<div id="lbCenter"></div>')[0]),
        (G = w('<div id="lbBottomContainer"></div>')[0]),
      ]).css('display', 'none')
    );
    g = w('<div id="lbImage"></div>')
      .appendTo(a)
      .append(
        (p = w('<div style="position: relative;"></div>').append([
          (I = w('<a id="lbPrevLink" href="#"></a>').click(B)[0]),
          (d = w('<a id="lbNextLink" href="#"></a>').click(e)[0]),
        ])[0])
      )[0];
    c = w('<div id="lbBottom"></div>')
      .appendTo(G)
      .append([
        w('<a id="lbCloseLink" href="#"></a>').add(H).click(C)[0],
        (A = w('<div id="lbCaption"></div>')[0]),
        (K = w('<div id="lbNumber"></div>')[0]),
        w('<div style="clear: both;"></div>')[0],
      ])[0];
  });
  w.slimbox = function (O, N, M) {
    u = w.extend(
      {
        loop: false,
        overlayOpacity: 0.8,
        overlayFadeDuration: 400,
        resizeDuration: 400,
        resizeEasing: 'swing',
        initialWidth: 250,
        initialHeight: 250,
        imageFadeDuration: 400,
        captionAnimationDuration: 400,
        counterText: 'Image {x} of {y}',
        closeKeys: [27, 88, 67],
        previousKeys: [37, 80],
        nextKeys: [39, 78],
      },
      M
    );
    if (typeof O == 'string') {
      O = [[O, N]];
      N = 0;
    }
    y = E.scrollTop() + E.height() / 2;
    L = u.initialWidth;
    r = u.initialHeight;
    w(a)
      .css({top: Math.max(0, y - r / 2), width: L, height: r, marginLeft: -L / 2})
      .show();
    v = m || (H.currentStyle && H.currentStyle.position != 'fixed');
    if (v) {
      H.style.position = 'absolute';
    }
    w(H).css('opacity', u.overlayOpacity).fadeIn(u.overlayFadeDuration);
    z();
    j(1);
    f = O;
    u.loop = u.loop && f.length > 1;
    return b(N);
  };
  w.fn.slimbox = function (M, P, O) {
    P =
      P ||
      function (Q) {
        return [Q.href, Q.title];
      };
    O =
      O ||
      function () {
        return true;
      };
    var N = this;
    return N.off('click').click(function () {
      var S = this,
        U = 0,
        T,
        Q = 0,
        R;
      T = w.grep(N, function (W, V) {
        return O.call(S, W, V);
      });
      for (R = T.length; Q < R; ++Q) {
        if (T[Q] == S) {
          U = Q;
        }
        T[Q] = P(T[Q], Q);
      }
      return w.slimbox(T, U, M);
    });
  };
  function z() {
    var N = E.scrollLeft(),
      M = E.width();
    w([a, G]).css('left', N + M / 2);
    if (v) {
      w(H).css({left: N, top: E.scrollTop(), width: M, height: E.height()});
    }
  }
  function j(M) {
    if (M) {
      w('object')
        .add(m ? 'select' : 'embed')
        .each(function (O, P) {
          s[O] = [P, P.style.visibility];
          P.style.visibility = 'hidden';
        });
    } else {
      w.each(s, function (O, P) {
        P[0].style.visibility = P[1];
      });
      s = [];
    }
    var N = M ? 'bind' : 'unbind';
    E[N]('scroll resize', z);
    w(document)[N]('keydown', o);
  }
  function o(O) {
    var N = O.keyCode,
      M = w.inArray;
    return M(N, u.closeKeys) >= 0 ? C() : M(N, u.nextKeys) >= 0 ? e() : M(N, u.previousKeys) >= 0 ? B() : false;
  }
  function B() {
    return b(x);
  }
  function e() {
    return b(D);
  }
  function b(M) {
    if (M >= 0) {
      F = M;
      n = f[F][0];
      x = (F || (u.loop ? f.length : 0)) - 1;
      D = (F + 1) % f.length || (u.loop ? 0 : -1);
      q();
      a.className = 'lbLoading';
      k = new Image();
      k.onload = i;
      k.src = n;
    }
    return false;
  }
  function i() {
    a.className = '';

    // https://stackoverflow.com/questions/3257059/limit-slimbox-lightbox-image-to-window-size
    const winWidth = w(window).width() - 20;
    const winHeight = w(window).height() - 20;
    const maxSize = winWidth > winHeight ? winHeight : winWidth;
    let my_w = k.width;
    let my_h = k.height;
    if (my_w > my_h) {
      my_h = (maxSize * my_h) / my_w;
      my_w = maxSize;
    } else {
      my_w = (maxSize * my_w) / my_h;
      my_h = maxSize;
    }
    if (k.width > my_w || k.height > my_h) {
      w(g).css({
        backgroundImage: 'url(' + n + ')',
        backgroundSize: my_w + 'px ' + my_h + 'px',
        visibility: 'hidden',
        display: '',
      });
      w(p).width(my_w);
      w([p, I, d]).height(my_h);
    } else {
      w(g).css({backgroundImage: 'url(' + n + ')', visibility: 'hidden', display: ''});
      w(p).width(k.width);
      w([p, I, d]).height(k.height);
    }

    w(A).html(f[F][1] || '');
    w(K).html(((f.length > 1 && u.counterText) || '').replace(/{x}/, F + 1).replace(/{y}/, f.length));
    if (x >= 0) {
      t.src = f[x][0];
    }
    if (D >= 0) {
      J.src = f[D][0];
    }
    L = g.offsetWidth;
    r = g.offsetHeight;
    var M = Math.max(0, y - r / 2);
    if (a.offsetHeight != r) {
      w(a).animate({height: r, top: M}, u.resizeDuration, u.resizeEasing);
    }
    if (a.offsetWidth != L) {
      w(a).animate({width: L, marginLeft: -L / 2}, u.resizeDuration, u.resizeEasing);
    }
    w(a).queue(function () {
      w(G).css({width: L, top: M + r, marginLeft: -L / 2, visibility: 'hidden', display: ''});
      w(g).css({display: 'none', visibility: '', opacity: ''}).fadeIn(u.imageFadeDuration, h);
    });
  }
  function h() {
    if (x >= 0) {
      w(I).show();
    }
    if (D >= 0) {
      w(d).show();
    }
    w(c).css('marginTop', -c.offsetHeight).animate({marginTop: 0}, u.captionAnimationDuration);
    G.style.visibility = '';
  }
  function q() {
    k.onload = null;
    k.src = t.src = J.src = n;
    w([a, g, c]).stop(true);
    w([I, d, g, G]).hide();
  }
  function C() {
    if (F >= 0) {
      q();
      F = x = D = -1;
      w(a).hide();
      w(H).stop().fadeOut(u.overlayFadeDuration, j);
    }
    return false;
  }
})(jQuery);
